package com.niit.session22;

import java.util.function.Consumer;

public class Test {
	public static void main(String[] args) {
		
//		使用匿名内部类来实现接口
		Calculate c = new Calculate() {
			@Override
			public void calculate(int a, int b) {
				System.out.println(a+b);
			}
		};
		c.calculate(2, 3);
		
//		lambda表达式的写法
//		lambda表达式是一个匿名方法，只关注形参和方法体，箭头左边是形参，右边是方法体
		Calculate c1 =(int a, int b) -> {
			System.out.println(a+b);
		};
		c1.calculate(2, 4);
//		省略形参的数据类型
		Calculate c2 =(a, b) -> {
			System.out.println(a+b);
		};
		c2.calculate(2, 4);
//		如果实现的方法只有一行代码，可以省略大括号，如果有多行代码就不可以省略
		Calculate c3 =(a, b) -> System.out.println(a+b);
		
		c3.calculate(2, 4);
//		Lambda表达式，一个整体其实是要给对象，可以当成参数传递
		test((a, b) -> System.out.println(a+b));
		
		
//		使用lambda表达式来实现一个带返回值的方法
		Calculate1 c4 = (int a) -> {
			return a*2;
		};
		System.out.println(c4.calculate(4));
//		如果形参只有一个变量，可以省略括号,
//		如果代码里只有一行return语句，则可以省略return关键字
		Calculate1 c5 =  a ->  a*2;
		System.out.println(c5.calculate(5));
		
//		正常的Lambda表达式
		Consumer<String> consumer = a -> System.out.println(a);
		consumer.accept("Hello");
//		如果函数时接口里的方法和重写时调用的方法形参一样，可以使用方法引用
//		省略形参和->调用发方法时使用::
		Consumer<String> consumer1 = System.out::println;
		consumer1.accept("Hello");
		
	}
	
	public static void test(Calculate c) {
		c.calculate(3, 2);
	}

}
